/**
 * FileName: JacksonUtil
 * Author:   miao_jin
 * Date:     2020/5/14 12:42
 * Description: //模块目的、功能描述
 */
package com.wangc.commons.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wangc.commons.configuration.jackson.JacksonCustom;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * Jackson工具类
 *
 * @author miao_jin
 */
@Slf4j
public class JacksonUtil {

    private static final ObjectMapper objectMapper;

    static {
        objectMapper = new JacksonCustom().customObjectMapper();
    }

    /**
     * 对象转Json格式字符串
     *
     * @param obj 对象
     * @return Json格式字符串
     */
    public static <T> String toJSONString(T obj) {
        if (obj == null) {
            return null;
        }
        try {
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error("Parse Object to String error :", e);
            return null;
        }
    }

    /**
     * Json转换为自定义对象
     *
     * @param json  要转换的字符串
     * @param clazz 自定义对象的class对象
     * @return 自定义对象
     */
    public static <T> T parseBean(String json, Class<T> clazz) {
        if (StringUtils.isEmpty(json) || clazz == null) {
            return null;
        }
        try {
            return clazz.equals(String.class) ? (T) json : objectMapper.readValue(json, clazz);
        } catch (Exception e) {
            log.error("Parse String to Bean error :", e);
            return null;
        }
    }

    /**
     * Json转换为自定义List对象
     *
     * @param json  要转换的字符串
     * @param clazz 自定义对象的List对象
     * @return 自定义对象
     */
    public static <T> List<T> parseList(String json, Class<T> clazz) {
        if (StringUtils.isEmpty(json) || clazz == null) {
            return null;
        }
        try {
            return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(
                            List.class, clazz));
        } catch (Exception e) {
            log.error("Parse String to List error :", e);
            return null;
        }
    }

    /**
     * Json转换为自定义Map对象
     *
     * @param json      要转换的字符串
     * @param keyType   自定义Map对象的Key对象
     * @param valueType 自定义Map对象的value对象
     * @return 自定义对象
     */
    public static <k, v> Map<k, v> parseMap(String json, Class<k> keyType, Class<v> valueType) {
        if (StringUtils.isEmpty(json)) {
            return null;
        }
        try {
            return objectMapper.readValue(json, objectMapper.getTypeFactory().constructMapType(
                    Map.class, keyType, valueType));
        } catch (Exception e) {
            log.error("Parse String to Map error :", e);
            return null;
        }
    }
}
